package capaPersistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import data.ProductoVO;

/**
 * Clase que tiene los metodos para trabajar con la Base de Datos para Insertar, eliminar y modificar productos
 * una vez se inserta,borra o modifica el producto tambien se tendra que insertar,borra o modifica
 *  en Ropa,LibroPeli o Coleccionables tambien existen estos metodos.
 */

public class ProductoDAO {

	
public boolean insertarProductoRopa (ProductoVO producto, Connection connection) {    
        
        try{
            /* Create "preparedStatement". */
        	String queryString = "INSERT INTO Producto " +
                    "(id,nombre,tipo,precio,stock,imagen,genero,autor,anyoEstreno,talla,color,tamano,descripcion) "
                    + "VALUES (?,?,?,?,?,?,null,null,null,?,?,null,?)";                      
            PreparedStatement preparedStatement = 
                connection.prepareStatement(queryString);
            
            /* Fill "preparedStatement". */  
            preparedStatement.setString(1, producto.getId());
            preparedStatement.setString(2, producto.getNombre());
            preparedStatement.setString(3, producto.getTipo());
            preparedStatement.setDouble(4, producto.getPrecio());
            preparedStatement.setInt(5,producto.getStock());
            preparedStatement.setString(6, producto.getImagen());
            preparedStatement.setString(7, producto.getTalla());
            preparedStatement.setString(8, producto.getColor());
            preparedStatement.setString(9, producto.getDescripcion());
           

            /* Execute query. */                    
            int insertedRows = preparedStatement.executeUpdate();
                
            if (insertedRows != 1) {
                throw new SQLException( "Problemas insertando producto de ropa!!!!");           
                }
            return true;
                
        } catch (SQLException e) {
            e.printStackTrace(System.err);
            return false;
        }
                
    }
public boolean insertarProductoLibroPeli (ProductoVO producto, Connection connection) {    
    
    try{
        /* Create "preparedStatement". */
    	String queryString = "INSERT INTO Producto " +
                "(id,nombre,tipo,precio,stock,imagen,genero,autor,anyoEstreno,talla,color,tamano,descripcion) "
                + "VALUES (?,?,?,?,?,?,?,?,?,null,null,null,?)";                      
        PreparedStatement preparedStatement = 
            connection.prepareStatement(queryString);
        
        /* Fill "preparedStatement". */  
        preparedStatement.setString(1, producto.getId());
        preparedStatement.setString(2, producto.getNombre());
        preparedStatement.setString(3, producto.getTipo());
        preparedStatement.setDouble(4, producto.getPrecio());
        preparedStatement.setInt(5,producto.getStock());
        preparedStatement.setString(6, producto.getImagen());
        preparedStatement.setString(7, producto.getGenero());
        preparedStatement.setString(8, producto.getAutor());
        preparedStatement.setInt(9,producto.getAnyo());
        preparedStatement.setString(10, producto.getDescripcion());
       

        /* Execute query. */                    
        int insertedRows = preparedStatement.executeUpdate();
            
        if (insertedRows != 1) {
            throw new SQLException( "Problemas insertando libros o pelis!!!!");           
            }
        return true;
            
    } catch (SQLException e) {
        e.printStackTrace(System.err);
        return false;
    }
            
}
public boolean insertarProductoColeccionables (ProductoVO producto, Connection connection) {    
    
    try{
        /* Create "preparedStatement". */
    	String queryString = "INSERT INTO Producto " +
                "(id,nombre,tipo,precio,stock,imagen,genero,autor,anyoEstreno,talla,color,tamano,descripcion) "
                + "VALUES (?,?,?,?,?,?,null,null,null,null,null,?,?)";                      
        PreparedStatement preparedStatement = 
            connection.prepareStatement(queryString);
        
        /* Fill "preparedStatement". */  
        preparedStatement.setString(1, producto.getId());
        preparedStatement.setString(2, producto.getNombre());
        preparedStatement.setString(3, producto.getTipo());
        preparedStatement.setDouble(4, producto.getPrecio());
        preparedStatement.setInt(5,producto.getStock());
        preparedStatement.setString(6, producto.getImagen());
        preparedStatement.setString(7, producto.getTamano());
        preparedStatement.setString(8, producto.getDescripcion());
        
       

        /* Execute query. */                    
        int insertedRows = preparedStatement.executeUpdate();
            
        if (insertedRows != 1) {
            throw new SQLException( "Problemas insertando productos coleccionables!!!!");           
            }
        return true;
            
    } catch (SQLException e) {
        e.printStackTrace(System.err);
        return false;
    }
            
}
	public boolean eliminarProducto (String id, Connection connection) {    
	      try{
	            /* Create "preparedStatement". */
	            String queryString = "DELETE FROM Producto " +
	                "WHERE id=?";                    
	            PreparedStatement preparedStatement = 
	                connection.prepareStatement(queryString);
	            
	            /* Fill "preparedStatement". */ 
	            preparedStatement.setString(1, id);
	            

	            /* Execute query. */                    
	           preparedStatement.executeUpdate();
	          return true;     
	         } catch (Exception e) {
	            e.printStackTrace(System.err);
	         }  
	      return false;
}
	

public boolean modificarProductoRopa (ProductoVO producto, Connection connection) {    
    try{
        /* Create "preparedStatement". */
    	String queryString = "UPDATE  Producto " +
                "SET  nombre=?, tipo=?,precio=?,stock=?,imagen=?,talla=?,color=?,descripcion=? " +
            	"WHERE id=?";
                                   
            PreparedStatement preparedStatement = 
                connection.prepareStatement(queryString);
            
            /* Fill "preparedStatement". */    
            preparedStatement.setString(1, producto.getNombre());
            preparedStatement.setString(2, producto.getTipo());
            preparedStatement.setDouble(3, producto.getPrecio());
            preparedStatement.setInt(4,producto.getStock());
            preparedStatement.setString(5, producto.getImagen());
            preparedStatement.setString(6, producto.getTalla());
            preparedStatement.setString(7, producto.getColor());
            preparedStatement.setString(8, producto.getDescripcion());
            preparedStatement.setString(9, producto.getId());


        /* Execute query. */                    
        int insertedRows = preparedStatement.executeUpdate();
            
        if (insertedRows != 1) {
            throw new SQLException( "Problemas modificando productos!!!!");           
            }
        return true;
            
    } catch (SQLException e) {
        e.printStackTrace(System.err);
        return false;
    }
}
    public boolean modificarProductoLibroPeli(ProductoVO producto, Connection connection) {    
    	try{
            /* Create "preparedStatement". */
        	String queryString = "UPDATE  Producto " +
                    "SET  nombre=?, tipo=?,precio=?,stock=?,imagen=?,genero=?,autor=?,anyoEstreno=?,descripcion=? " +
                	"WHERE id=?";
                                       
                PreparedStatement preparedStatement = 
                    connection.prepareStatement(queryString);
                
                /* Fill "preparedStatement". */    
                preparedStatement.setString(1, producto.getNombre());
                preparedStatement.setString(2, producto.getTipo());
                preparedStatement.setDouble(3, producto.getPrecio());
                preparedStatement.setInt(4,producto.getStock());
                preparedStatement.setString(5, producto.getImagen());
                preparedStatement.setString(6, producto.getGenero());
                preparedStatement.setString(7, producto.getAutor());
                preparedStatement.setInt(8,producto.getAnyo());
                preparedStatement.setString(9, producto.getDescripcion());
                preparedStatement.setString(10, producto.getId());


            /* Execute query. */                    
            int insertedRows = preparedStatement.executeUpdate();
                
            if (insertedRows != 1) {
                throw new SQLException( "Problemas modificando productos!!!!");           
                }
            return true;
                
        } catch (SQLException e) {
            e.printStackTrace(System.err);
            return false;
        }
            
}
    public boolean modificarProductoColeccionables(ProductoVO producto, Connection connection) {    
        try{
            /* Create "preparedStatement". */
        	String queryString = "UPDATE  Producto " +
                    "SET  nombre=?, tipo=?,precio=?,stock=?,imagen=?,tamano=?,descripcion=? " +
                	"WHERE id=?";
                                       
                PreparedStatement preparedStatement = 
                    connection.prepareStatement(queryString);
                
                /* Fill "preparedStatement". */    
                preparedStatement.setString(1, producto.getNombre());
                preparedStatement.setString(2, producto.getTipo());
                preparedStatement.setDouble(3, producto.getPrecio());
                preparedStatement.setInt(4,producto.getStock());
                preparedStatement.setString(5, producto.getImagen());
                preparedStatement.setString(6, producto.getTamano());
                preparedStatement.setString(7, producto.getDescripcion());
                preparedStatement.setString(8, producto.getId());

            /* Execute query. */                    
            int insertedRows = preparedStatement.executeUpdate();
                
            if (insertedRows != 1) {
                throw new SQLException( "Problemas modificando productos!!!!");           
                }
            return true;
                
        } catch (SQLException e) {
            e.printStackTrace(System.err);
            return false;
        }
    }
    public ProductoVO obtenerProducto (String id,Connection connection){
    	ProductoVO producto=null;
    	try{
            /* Create "preparedStatement". */
            String queryString = "SELECT nombre,tipo,precio,stock,imagen,genero,autor,anyoEstreno,talla,color,tamano,descripcion FROM Producto " +
                "WHERE id=?";                    
            PreparedStatement preparedStatement = 
                connection.prepareStatement(queryString);
            
            /* Fill "preparedStatement". */    
            preparedStatement.setString(1, id);
            /* Execute query. */                    
            ResultSet rs = preparedStatement.executeQuery();
            while(rs.next()){
            	String nombre = rs.getString(1);
            	String tipo = rs.getString(2);
            	double precio = rs.getDouble(3);
            	int stock = rs.getInt(4);
            	String imagen = rs.getString(5);
            	String genero = rs.getString(6);
            	String autor = rs.getString(7);
            	int anyoEstreno = rs.getInt(8);
            	String talla = rs.getString(9);
            	String color = rs.getString(10);
            	String tamano = rs.getString(11);
            	String descripcion = rs.getString(12);
            	if(tipo.equals("Libro") || tipo.equals("Pelicula")){
            	producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,genero,autor,anyoEstreno,descripcion);
            	}
            	else if(tipo.equals("Ropa")){
            		producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,talla,color,descripcion);
            	}
            	else producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,tamano,descripcion);
            }
            
                
            
         } catch (Exception e) {
            e.printStackTrace(System.err);
         }
    	return producto;
    }
    
    public ArrayList<ProductoVO> obtenerProductos (String tipo,Connection connection){
    	ArrayList<ProductoVO> listaProductos=new ArrayList<ProductoVO>();
    	try{
    		if(tipo.equals("Libro") ){
	            /* Create "preparedStatement". */
	            String queryString = "SELECT id,nombre,precio,stock,imagen,genero,autor,anyoEstreno,descripcion FROM Producto " +
	                "WHERE tipo=? ";                    
	            PreparedStatement preparedStatement = 
	                connection.prepareStatement(queryString);
	            
	            /* Fill "preparedStatement". */    
	            preparedStatement.setString(1, tipo);
	            /* Execute query. */                    
	            ResultSet rs = preparedStatement.executeQuery();
	            while(rs.next()){
	            	String id = rs.getString(1);
	            	String nombre = rs.getString(2);
	            	double precio = rs.getDouble(3);
	            	int stock = rs.getInt(4);
	            	String imagen = rs.getString(5);
	            	String genero = rs.getString(6);
	            	String autor = rs.getString(7);
	            	int anyoEstreno = rs.getInt(8);
	            	String descripcion = rs.getString(9);
	            	ProductoVO producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,genero,autor,anyoEstreno,descripcion);
	            	listaProductos.add(producto);
	            	}
    		}
    		else if(tipo.equals("Ropa")){
    			/* Create "preparedStatement". */
	            String queryString = "SELECT id,nombre,precio,stock,imagen,talla,color,descripcion FROM Producto " +
	                "WHERE tipo=? ";                    
	            PreparedStatement preparedStatement = 
	                connection.prepareStatement(queryString);
	            
	            /* Fill "preparedStatement". */    
	            preparedStatement.setString(1, tipo);
	            /* Execute query. */                    
	            ResultSet rs = preparedStatement.executeQuery();
	            while(rs.next()){
	            	String id = rs.getString(1);
	            	String nombre = rs.getString(2);
	            	double precio = rs.getDouble(3);
	            	int stock = rs.getInt(4);
	            	String imagen = rs.getString(5);
	            	String talla = rs.getString(6);
	            	String color = rs.getString(7);
	            	String descripcion = rs.getString(8);
	            	ProductoVO producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,talla,color,descripcion);
	            	listaProductos.add(producto);
	            	}
    		}
    		else{
    			/* Create "preparedStatement". */
	            String queryString = "SELECT id,nombre,precio,stock,imagen,tamano,descripcion FROM Producto " +
	                "WHERE tipo=? ";                    
	            PreparedStatement preparedStatement = 
	                connection.prepareStatement(queryString);
	            
	            /* Fill "preparedStatement". */    
	            preparedStatement.setString(1, tipo);
	            /* Execute query. */                    
	            ResultSet rs = preparedStatement.executeQuery();
	            while(rs.next()){
	            	String id = rs.getString(1);
	            	String nombre = rs.getString(2);
	            	double precio = rs.getDouble(3);
	            	int stock = rs.getInt(4);
	            	String imagen = rs.getString(5);
	            	String tamano = rs.getString(6);
	            	String descripcion = rs.getString(7);
	            	ProductoVO producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,tamano,descripcion);
	            	listaProductos.add(producto);
	            	}
    			
    		}
            
                
            
         } catch (Exception e) {
            e.printStackTrace(System.err);
         }
    	return listaProductos;
    }
    public ArrayList<ProductoVO> obtenerProductosPrecio (double precio,Connection connection){
    	ArrayList<ProductoVO> listaProductos=new ArrayList<ProductoVO>();
    	try{
	            /* Create "preparedStatement". */
	            String queryString = "SELECT id,nombre,tipo,stock,imagen,genero,autor,anyoEstreno,talla,color,tamano,descripcion FROM Producto " +
	                "WHERE precio=? ";                    
	            PreparedStatement preparedStatement = 
	                connection.prepareStatement(queryString);
	            
	            /* Fill "preparedStatement". */    
	            preparedStatement.setDouble(1, precio);
	            /* Execute query. */                    
	            ResultSet rs = preparedStatement.executeQuery();
	            while(rs.next()){
	            	String id = rs.getString(1);
	            	String nombre = rs.getString(2);
	            	String tipo = rs.getString(3);
	            	int stock = rs.getInt(4);
	            	String imagen = rs.getString(5);
	            	String genero = rs.getString(6);
	            	String autor = rs.getString(7);
	            	int anyoEstreno = rs.getInt(8);
	            	String talla = rs.getString(9);
	            	String color = rs.getString(10);
	            	String tamano = rs.getString(11);
	            	String descripcion = rs.getString(12);
	            	ProductoVO producto=null;
	            	if(genero!=null){
	            		producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,genero,autor,anyoEstreno,descripcion);
	            	}
	            	if(talla!=null){
	            		producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,talla,color,descripcion);
	            	}
	            	if(tamano!=null){
	            		producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,tamano,descripcion);
	            	}
	            	
	            	listaProductos.add(producto);
	            	}
    		}
    		 catch (Exception e) {
            e.printStackTrace(System.err);
         }
    	return listaProductos;
    }
    
    public ArrayList<ProductoVO> obtenerProductosNombre (String n,Connection connection){
    	ArrayList<ProductoVO> listaProductos=new ArrayList<ProductoVO>();
    	try{
	            /* Create "preparedStatement". */
	            String queryString = "SELECT id,precio,tipo,stock,imagen,genero,autor,anyoEstreno,talla,color,tamano,descripcion,nombre FROM Producto " +
	                "WHERE nombre like ? ";                    
	            PreparedStatement preparedStatement = 
	                connection.prepareStatement(queryString);
	            
	            preparedStatement.setString(1, "%" + n + "%");
	            
	            /* Execute query. */                    
	            ResultSet rs = preparedStatement.executeQuery();
	            while(rs.next()){
	            	String id = rs.getString(1);
	            	double precio = rs.getDouble(2);
	            	String tipo = rs.getString(3);
	            	int stock = rs.getInt(4);
	            	String imagen = rs.getString(5);
	            	String genero = rs.getString(6);
	            	String autor = rs.getString(7);
	            	int anyoEstreno = rs.getInt(8);
	            	String talla = rs.getString(9);
	            	String color = rs.getString(10);
	            	String tamano = rs.getString(11);
	            	String descripcion = rs.getString(12);
	            	String nombre = rs.getString(13);
	            	ProductoVO producto=null;
	            	if(genero!=null){
	            		producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,genero,autor,anyoEstreno,descripcion);
	            	}
	            	if(talla!=null){
	            		producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,talla,color,descripcion);
	            	}
	            	if(tamano!=null){
	            		producto= new ProductoVO(id,nombre,tipo,precio,stock,imagen,tamano,descripcion);
	            	}
	            	
	            	listaProductos.add(producto);
	            	}
    		}
    		 catch (Exception e) {
            e.printStackTrace(System.err);
         }
    	return listaProductos;
    }
    
    
    
    public ArrayList<ProductoVO> ordenarProductosPrecio (Connection connection){
    	ArrayList<ProductoVO> listaProductos=new ArrayList<ProductoVO>();
    	try{
	            /* Create "preparedStatement". */
	            String queryString = "SELECT id,nombre,tipo,precio,stock,imagen,descripcion FROM Producto " +
	                "ORDER BY precio DESC";                    
	            PreparedStatement preparedStatement = 
	                connection.prepareStatement(queryString);
	            

	            /* Execute query. */                    
	            ResultSet rs = preparedStatement.executeQuery();
	            while(rs.next()){
	            	String id = rs.getString(1);
	            	String nombre = rs.getString(2);
	            	String tipo = rs.getString(3);
	            	double precio = rs.getDouble(4);
	            	int stock = rs.getInt(5);
	            	String imagen = rs.getString(6);
	            	String descripcion = rs.getString(7);
	            	ProductoVO producto=new ProductoVO(id,nombre,tipo,precio,stock,imagen,descripcion);
	            	listaProductos.add(producto);
	            	}
    		}
    		 catch (Exception e) {
            e.printStackTrace(System.err);
         }
    	return listaProductos;
    }
    public ArrayList<ProductoVO> ordenarProductosNombre (Connection connection){
    	ArrayList<ProductoVO> listaProductos=new ArrayList<ProductoVO>();
    	try{
	            /* Create "preparedStatement". */
	            String queryString = "SELECT id,nombre,tipo,precio,stock,imagen,descripcion FROM Producto " +
	                "ORDER BY nombre";                    
	            PreparedStatement preparedStatement = 
	                connection.prepareStatement(queryString);
	            

	            /* Execute query. */                    
	            ResultSet rs = preparedStatement.executeQuery();
	            while(rs.next()){
	            	String id = rs.getString(1);
	            	String nombre = rs.getString(2);
	            	String tipo = rs.getString(3);
	            	double precio = rs.getDouble(4);
	            	int stock = rs.getInt(5);
	            	String imagen = rs.getString(6);
	            	String descripcion = rs.getString(7);
	            	ProductoVO producto=new ProductoVO(id,nombre,tipo,precio,stock,imagen,descripcion);
	            	listaProductos.add(producto);
	            	}
    		}
    		 catch (Exception e) {
            e.printStackTrace(System.err);
         }
    	return listaProductos;
    }
	public ArrayList<ProductoVO> ordenarProductosTipo(Connection connection) {
		ArrayList<ProductoVO> listaProductos=new ArrayList<ProductoVO>();
    	try{
	            /* Create "preparedStatement". */
	            String queryString = "SELECT id,nombre,tipo,precio,stock,imagen,descripcion FROM Producto " +
	                "ORDER BY tipo";                    
	            PreparedStatement preparedStatement = 
	                connection.prepareStatement(queryString);
	            

	            /* Execute query. */                    
	            ResultSet rs = preparedStatement.executeQuery();
	            while(rs.next()){
	            	String id = rs.getString(1);
	            	String nombre = rs.getString(2);
	            	String tipo = rs.getString(3);
	            	double precio = rs.getDouble(4);
	            	int stock = rs.getInt(5);
	            	String imagen = rs.getString(6);
	            	String descripcion = rs.getString(7);
	            	ProductoVO producto=new ProductoVO(id,nombre,tipo,precio,stock,imagen,descripcion);
	            	listaProductos.add(producto);
	            	}
    		}
    		 catch (Exception e) {
            e.printStackTrace(System.err);
         }
    	return listaProductos;
	}
    
}